package com.naiterui.ehp.bs.agent.websocket;

import cn.hutool.core.util.StrUtil;
import com.naiterui.common.redis.RedisUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 经纪人ws消息API
 * 提供业务层引入，处理ws消息推送使用
 * <p>
 * 全量推送：忽略用户在线、离线等复杂逻辑，仅实现在线可推送
 * 指定用户推送：Redis持久化消息，在线实时推送、离线下次连接后补发推送
 *
 * @author gaoliangliang
 * @since 2022/2/22
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class WebsocketApi {

    /**
     * 指定目标消息推送
     *
     * @param toUserId
     * @param message
     */
    public void sendMessage(String toUserId, String message) {
        if (StrUtil.hasBlank(toUserId, message)) {
            return;
        }
        log.info("指定目标消息发送，toUserId={},message={}", toUserId, message);
        RedisUtil.listOps().rpush(WebsocketConstant.persistentQueue(toUserId), message);
        RedisUtil.keyOps().publish(WebsocketConstant.AGENT_MESSAGE_QUEUE, WebsocketMessage.builder()
                .fromUserId(WebsocketConstant.SYSTEM_USER)
                .message(message)
                .toUserId(toUserId)
                .build().toJson());
    }

    /**
     * 指定来源、目标消息推送
     *
     * @param fromUserId
     * @param toUserId
     * @param message
     */
    public void sendMessage(String fromUserId, String toUserId, String message) {
        if (StrUtil.hasBlank(fromUserId, toUserId, message)) {
            return;
        }
        log.info("指定来源、目标消息发送，fromUserId={},toUserId={},message={}", fromUserId, toUserId, message);
        RedisUtil.listOps().rpush(WebsocketConstant.persistentQueue(toUserId), message);
        RedisUtil.keyOps().publish(WebsocketConstant.AGENT_MESSAGE_QUEUE, WebsocketMessage.builder()
                .message(message)
                .fromUserId(fromUserId)
                .toUserId(toUserId)
                .build().toJson());
    }

    /**
     * 全量消息推送
     *
     * @param message
     */
    public void sendMessage(String message) {
        if (StrUtil.hasBlank(message)) {
            return;
        }
        log.info("全量消息发送，message={}", message);
        RedisUtil.keyOps().publish(WebsocketConstant.AGENT_MESSAGE_QUEUE, WebsocketMessage.builder()
                .fromUserId(WebsocketConstant.SYSTEM_USER)
                .message(message)
                .toUserId(WebsocketConstant.ALL_USER)
                .build().toJson());
    }

}
